package com.itranswarp.learnjava.service;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;

// 如果把注解改为 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) ：
//- 则只有在实际获取这个 bean 的时候才会创建实例
//- 每次获取都会创建新的实例
//- 打印语句也会在每次获取时执行
// 多例模式中初始化的时候PostConstruct会被调用
@Component
public class MailService {

    // required = false表示如果没有找到ZoneId类型的Bean，就不注入，而是使用默认值。
    @Autowired(required = false)
    ZoneId zoneId = ZoneId.systemDefault();

    // @PostConstruct表示在Bean实例创建完毕后，自动调用该方法，不是创建bean的时候调用，而是在bean实例创建完成后调用。
    @PostConstruct
    public void init() {
        System.out.println("Init mail service with zoneId = " + this.zoneId);
    }

    // @PreDestroy表示在Bean销毁前，自动调用该方法。
    @PreDestroy
    public void shutdown() {
        System.out.println("Shutdown mail service");
    }

    public String getTime() {
        return ZonedDateTime.now(this.zoneId).format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    }

    public void sendLoginMail(User user) {
        System.err.println(String.format("Hi, %s! You are logged in at %s", user.getName(), getTime()));
    }

    public void sendRegistrationMail(User user) {
        System.err.println(String.format("Welcome, %s!", user.getName()));

    }
}
